import router from '@/router'
import {
  createFetch,
  type MaybeRefOrGetter,
  type UseFetchReturn,
} from '@vueuse/core'
import { message } from 'ant-design-vue'
import { useUserStore } from '@/common/stores/modules/users-store'

// 从环境变量中获取后端基地址
const baseURL = import.meta.env.EDUC_API_BASE_URL

// 定义后端响应数据的通用结构
export interface Data<T> {
  code: number
  message: string
  data: T
}

/**请求参数 */
interface RequestOptions {
  url: MaybeRefOrGetter<string>
  options?: RequestInit
}

type _Request = <T>(options: RequestOptions) => Promise<UseFetchReturn<Data<T>>>

/**
 * 用于发送 HTTP 请求的自定义 组合式函数
 * @param url 请求路径，可以是响应式引用或获取字符串的函数
 * @param options 请求参数
 * @returns 包含请求结果的 UseFetchReturn 对象，其数据部分符合 Data<T> 结构
 */
export const useRequest: _Request = async ({ url, options }) => {
  console.log(
    'Starting request with url:',
    typeof url === 'function' ? url() : url,
    'and options:',
    options,
  )

  const fetch = createFetch({
    baseUrl: baseURL, // 后端基地址
    combination: 'overwrite',
    options: {
      // 请求发送之前拦截请求
      async beforeFetch(ctx) {
        // 获取 userStore 来获取 token
        const userStore = useUserStore()

         // 获取 token
         const token = userStore.userInfo?.token // 假设 userInfo 存储了 token

         console.log(token,'请求体')
        // 在请求头中添加 Content-Type 和 token
        ctx.options.headers = {
          ...ctx.options.headers,
          'Content-Type': 'application/json', // 你需要添加的请求头
          Authorization: token ?? '', // 如果 token 存在，则添加到 Authorization 头部
        }

        console.log('Request Headers:', ctx.options.headers)
      },

      // 更新响应数据之前拦截响应数据
      afterFetch(ctx) {
        console.log('afterFetch:', ctx)
        // 可以在这里对响应数据进行进一步处理，如数据转换等
        return ctx
      },

      onFetchError(ctx) {
        console.log('onFetchError:', ctx)
        if (ctx.response) {
          // 如果服务器返回了错误信息，可以根据具体的错误码或消息进行更详细的处理
          message.error(`请求失败:${ctx.response.statusText}`)
        } else {
          // 处理其他类型的错误，如网络连接问题
          message.error('请求失败,请检查网络连接')
        }
        return ctx
      },
    },
    fetchOptions: options,
  })

  return await fetch(url).json()
}
